#include "Sqqueue.h"

/*
InitQueue:初始化一个队列
返回值:返回创建好的队列的地址
*/
SqQueue *InitQueue()
{
    //分配队列空间
    SqQueue *q = (SqQueue *)malloc(sizeof(SqQueue));
    //初始化
    q->rear = 0;    //入队下标
    q->front = 0;   //出队下标
    q->num = 0;    //元素个数
    return q;
}

/*
DestoryQueue:销毁一个队列
@q:你要销毁的队列的地址
返回值:无
*/
void DestoryQueue(SqQueue *q)
{
    if(q)
    {
        //释放队列空间
        free(q);
    }
}

/*
ClearQueue :清空一个队列(把队列中的数据元素都清空)
@q:你要清空的队列的地址
返回值:无
*/
void ClearQueue(SqQueue *q)
{
    //清空队列不是删除队列
    q->rear = q->front = 0;
    q->num = 0;
}


/*
QueueIsEmpty:判断队列是否为空(是否存在用户数据)
@q:你要操作的队列的地址
返回值:
    返回true表示队列为空
    返回false表示队列不为空
*/
bool QueueIsEmpty(SqQueue *q)
{
    return q==NULL || q->num == 0;
}


/*
QueueSize:获取队列的大小(用户元素的个数)
@q:你要操作的队列的地址
返回值:
返回队列中当前的元素个数
*/
int QueueSize(SqQueue *q)
{
    return q == NULL?0:q->num;
}

/*
GetHead:获取队头元素(下一次出队的元素),但是不出队列
@q:你要操作的队列的地址
@v:指针,指向一块可用的空间,用来保存队头数据的值
返回值:
    返回true表示获取成功
    返回false表示获取失败
*/
bool GetHead(SqQueue *q,Datatype *v)
{
    if(QueueIsEmpty(q))
    {
        return false;  //获取失败
    }
    *v = q->data[ q->front ];
    return true;
}

/*
EnQueue(Push):入队列,把一个用户数据存放到队列中去(放到队尾)
@q:你要操作的队列的地址
@value:你要入队的数据
返回值:
    返回true表示入队成功
    返回false表示入队失败
*/
bool EnQueue(SqQueue *q,Datatype value)
{
    if(q == NULL || q->num == MAX_NUM)
    {
        return false;  
    }
    //把值value放到rear表示的下标位置
    q->data[q->rear] = value;
    q->rear++;
    if(q->rear == MAX_NUM)
    {
        q->rear = 0;
    }
    q->num++;
    return true;
}

/*
DeQueue(Pop):出队列,把一个用户数据从队列中拿出来(去掉队头)
@q:你要操作的队列的地址
返回值:
    返回true表示出队成功
    返回false表示出队失败
*/
bool DeQueue(SqQueue *q)
{
    if(QueueIsEmpty(q))
    {
        return false;
    }
    //出队操作
    q->front++;
    q->front = q->front%MAX_NUM;
    q->num--;
    return true;
}

